<!DOCTYPE HTML>
<script src="../../resources/gesture-util.js"></script>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/compositor-controls.js"></script>
<style>
  body {
    margin: 0px;
    height: 3000px;
    width: 3000px;
  }
  p {
    width: 750px;
  }
  #scrollable {
    height: 400px;
    width: 400px;
  }
</style>

<p>
  This test ensures that autoscrolling doesn't scroll an iframe that's marked
  as unscrollable via `scrolling="no"`. To test manually, fully scroll the blue
  inner scroller and use middle click autoscroll (Windows feature) from the
  inner blue scroller or the rest of the iframe to scroll downwards. This test
  passes if the iframe that contains the blue scroller doesn't scroll.
</p>
<iframe id="scrollable" scrolling="no" srcdoc="
  <!DOCTYPE html>
  <style>
    body {
      width: 410px;
      height: 410px;
    }
    #scroller {
      width: 300px;
      height: 300px;
      overflow: scroll;
      background-color: blue;
    }
    #space {
     width: 400px;
     height: 400px;
    }
  </style>
  <div id='scroller'>
    <div id='space'></div>
  </div>
"></iframe>

<script>
setAnimationRequiresRaster();
var scrollable = document.getElementById('scrollable');

function autoScroll(start_x, start_y, end_x, end_y) {
  return new Promise((resolve, reject) => {
    if (!window.eventSender) {
      reject();
    } else {
      const MIDDLE_BUTTON = 1;
      eventSender.mouseMoveTo(start_x, start_y);
      eventSender.mouseDown(MIDDLE_BUTTON);
      eventSender.mouseUp(MIDDLE_BUTTON);
      eventSender.mouseMoveTo(end_x, end_y);
      resolve();
    }
  });
}

window.addEventListener('load', () => {
    var inner_scroller = frames[0].document.getElementById('scroller');
    inner_scroller.scrollTop = 1000;
    promise_test(async t => {
      const MIDDLE_CLICK_AUTOSCROLL_RADIUS = 15; // from blink::kNoMiddleClickAutoscrollRadius
      var rect = scrollable.getBoundingClientRect();
      var startX = rect.left + 50;
      var startY = rect.top + 50;
      var endX = startX;
      var endY = startY + 30 * MIDDLE_CLICK_AUTOSCROLL_RADIUS;
      assert_equals(inner_scroller.scrollTop,
                    inner_scroller.scrollHeight - inner_scroller.clientHeight,
                    "Inner scroller starts fully scrolled.");
      assert_equals(window.scrollY, 0, "Main window starts unscrolled.");
      assert_equals(frames[0].window.scrollY, 0, "IFrame starts unscrolled.");

      // Autoscroll over the inner scroller.
      await autoScroll(startX, startY, endX, endY);
      await waitForAnimationEndTimeBased( () => { return window.scrollY; } );
      assert_equals(frames[0].window.scrollY, 0, "Iframe frame should not scroll");

      // Autoscroll over the iframe.
      startX = rect.right - 20;
      endX = startX;
      await autoScroll(startX, startY, endX, endY);
      await waitForAnimationEndTimeBased( () => { return window.scrollY; } );
      assert_true(window.scrollY > 0, "Main frame should not scroll");
      assert_equals(frames[0].window.scrollY, 0, "IFrame must NOT scroll.");
    });
});

</script>
